<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    //编写智能重复smartRepeat函数
    //将3[abc]> abcabcabc
    //将3[2[a]2[b]]变为aabbaabbaabb
    
    //遍历每一个字符
    //如果这个字符是数字，那么就把数字压栈，把空字符串压栈
    //如果这个字符是字母，那么此时就把栈顶这项改为这个字母
    //如果这个字符是],那么就将数字弹栈，就把字符串栈的栈定的元素重复刚刚的这个次数，弹栈，拼接到新栈顶上

    function smartRepeat(templateStr){
      //指针
      var index = 0;
      //两个栈
      var stack1 = [];//数字
      var stack2 = [];//临时字符串
      //剩余部分
      var rest = '';

      while(index < templateStr.length - 1){
        //剩余部分
        rest = templateStr.substring(index)
        console.log(rest)
        //看当前剩余部分是不是以数字和[开头
        if(/^\d+\[/.test(rest)){
          //如果这个字符是数字，那么就把数字压栈，把空字符串压栈
          let times = Number(rest.match(/^(\d+)\[/)[1])
          stack1.push(times);
          stack2.push('')
          //让指针后移，times这个数字是多少位就后移多少位加1位，1是[
            index += times.toString().length + 1;
          } else if(/^\w\]/.test(rest)){
            //如果这个字符是字母，那么此时就把栈顶这项改为这个字母
            let word = rest.match(/^(\w)\]/)[1];
          stack2[stack2.length - 1] = word
          //让指针后移，word这个词是多少位就后移多少位
          index += word.length;
        } else if(rest[0] == ']'){
          //如果这个字符是],那么就将stack1弹栈，stack2弹栈把字符串栈的栈顶的元素重复刚刚的弹出的哪个字符串指定次数拼接到新栈顶上
          let times = stack1.pop();
          let word = stack2.pop();
          //repeat是ES6方法，比如'a'.repeat(3)得到'aaa'
          stack2[stack2.length - 1] += word.repeat(times)
          index++;
        }
        //console.log(stack1,stack2)
      }
      //while结束后，stack1喝stack2肯定剩一项，如果剩的个数，就是用户调用的问题，如方括号没有闭合 Array [ 3 ]  Array [ "aabb" ]
      return stack2[0].repeat(stack1[0]);
    }
    var result = smartRepeat('3[2[a]2[b]]')
    console.log(result)
  </script>
</body>
</html>